#ifndef __TLV_H__
#define __TLV_H__
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>

// 命令码
typedef enum tlv_type_e
{
    CMD_CD = 1,       // 1表示cd命令
    CMD_LS = 2,       // 2表示ls命令
    CMD_PWD = 3,      // 3表示pwd命令
    CMD_PUTS_REQ = 4, // 4表示接下来会执行puts命令
    CMD_GETS_REQ = 5, // 5表示接下来会执行gets命令
    CMD_QUIT = 6,     // 6表示退出登录
    CMD_MKDIR = 7,    // 7表示mkdir命令
    CMD_RMDIR = 8,    // 8表示rmdir命令
    CMD_RESPONSE = 9, // 9表示服务器正常响应
    DO_LOGIN = 10,    // 12表示登录验证
    LOGIN_IN = 11,    // 13表示验证通过
    LOGIN_FALSE = 12, // 14表示验证不通过
    DO_REGISTER = 15, // 17表示注册请求
    DO_DELETE = 16,   // 18表示删除用户请求
    TOKEN = 19        // 19表示token
} tlv_type_t;

// 协议头
typedef struct tlv_hdr_s
{
    int type;   // 类型
    int length; // 发送的内容的长度
} tlv_hdr_t;

// 完整的协议
typedef struct tlv_msg_s
{
    tlv_hdr_t hdr;    // 头
    char value[4096]; // 内容
} tlv_msg_t;

/**
 * @brief 创建一个tlv
 *
 * @param msg 需要创建的tlv
 * @param type tlv的类型
 * @param length tlv的内容长度
 * @param value tlv的内容
 * @return 创建是否成功，0表示成功，-1表示失败
 */
int tlv_create(tlv_msg_t *msg, tlv_type_t type, int length, const char *value);

/**
 * @brief 发送一个tlv
 *
 * @param netfd 发送的用户连接的netfd
 * @param msg 需要发送的tlv
 * @return 发送是否成功，0表示成功，1表示用户断开连接，-1表示失败
 */
int tlv_recv(int netfd, tlv_msg_t *msg);

/**
 * @brief 接收一个tlv
 *
 * @param netfd 接收的用户连接的netfd
 * @param msg 需要接收的tlv
 * @return 接收是否成功，0表示成功，1表示用户断开连接，-1表示失败
 */
int tlv_send(int netfd, const tlv_msg_t *msg);

#endif // __TLV_H__